/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Util;

import Negocio.ObjetoDatos;
import TablasAuxiliares.TAActividadesEmpresas;
import TablasAuxiliares.TACamposPremisas;
import TablasAuxiliares.TACargosEmpresa;
import TablasAuxiliares.TACilindradasVehiculo;
import TablasAuxiliares.TAEstadosCiviles;
import TablasAuxiliares.TAGeneral;
import TablasAuxiliares.TAHobbies;
import TablasAuxiliares.TANivelesEstudios;
import TablasAuxiliares.TAPaises;
import TablasAuxiliares.TAProfesiones;
import TablasAuxiliares.TASexos;
import TablasAuxiliares.TASituacionesLaborales;
import TablasAuxiliares.TATiposBien;
import TablasAuxiliares.TATiposDocumento;
import TablasAuxiliares.TATiposElectrodomestico;
import TablasAuxiliares.TATiposFinanciacion;
import TablasAuxiliares.TATiposInmueble;
import TablasAuxiliares.TATiposInteres;
import TablasAuxiliares.TATiposOcio;
import TablasAuxiliares.TATiposOtros;
import TablasAuxiliares.TATiposSalud;
import TablasAuxiliares.TATiposVehiculo;
import TablasAuxiliares.TAUsosVehiculo;
import TablasAuxiliares.TAValoresBooleanos;
import TablasAuxiliares.TAZonasInmueble;
import TablasAuxiliares.TablaAuxiliarBase;
import java.awt.Color;
import java.awt.Component;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.UIManager;

/**
 *
 * @author Javi
 */
public class Varios {

    /*
     * Devuelve la posición que ocupa un literal en un vector de Strings.
     * Si no se encuentra el literal devuelve -1
     */
    public static int getPosCadena ( Vector columnIdentifiers, String nombre ){
        if ( columnIdentifiers == null )
            return -1;

        for (int i = 0; i < columnIdentifiers.size(); i++)
            if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase(nombre) == 0 )
                return i;
        return -1;
    }

    /*
     * Devuelve el literal que corresponde a cada código de operación
     */
    public static String getLiteralOperacion( char cOperacion ){
        switch (cOperacion){
            case 'A': return "Alta";
            case 'B': return "Baja";
            case 'M': return "Modificación";
            case 'C': return "Consulta";
            case 'S': return "Selección";
            case 'N': return "Concesión";
            default:  return "Error";
        }
    }

    public static boolean integerToBoolean( int iValor){
        return ( iValor != 0 );
    }

    public static int booleanToInteger( boolean bValor ){
        if (bValor)
            return 1;
        else
            return 0;
    }

    public static String dateToString( Date dValor ){
        if (dValor == null)
            return "";
        SimpleDateFormat formatoDeFecha = new SimpleDateFormat("yyyy-MM-dd");
        return formatoDeFecha.format(dValor);
    }

    public static Date stringToDate( String sValor ){
        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
        Date fecha = null;
        try {
            fecha = formatoDelTexto.parse(sValor);
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return fecha;
    }

    /*
     * Habilita o deshabilita todos los controles de tipo Textfield, combobox y checkbox
     * de un componente (normalmente pane o tabbedpane).
     */
    public static void SetEnabledControles (JComponent panel, boolean valor){
        Component[] componentes = panel.getComponents();
        for(int i=0; i<componentes.length;i++){
            //Si el componente es un JPanel o un JTabbedPane lanzo la
            //función recursivamente para aplicarlo sobre sus componentes.
            if(componentes[i] instanceof JPanel )
                SetEnabledControles ( (JPanel) componentes[i], valor );
            if(componentes[i] instanceof JTabbedPane )
                SetEnabledControles ( (JTabbedPane) componentes[i], valor );

            if(componentes[i] instanceof JTextField)
                ((JTextField)componentes[i]).setEditable(valor);
            if(componentes[i] instanceof JComboBox)
                ((JComboBox)componentes[i]).setEnabled(valor);
            if(componentes[i] instanceof JCheckBox)
                ((JCheckBox)componentes[i]).setEnabled(valor);
        }
    }

    /*
     * Recibe como parámetro un combo que se carga a partir del objeto de datos pasado como parámetro
     * (una tabla auxiliar Codigo-Descripción) con literales tipo "código - descripcion"
     * Se incluye además en el combo un elemento vacío para que pueda no seleccionarse nada.
     * Si se pasa null en vez del objeto de datos, el combo se carga con un único elemento vacío.
     */
    public static void cargaCombo ( JComboBox combo, ObjetoDatos oDatos){
        //Inicializo el combo
        combo.removeAllItems();
        //Inicializo el primer elemento como un elemento vacío
        combo.addItem ("");
        if ( oDatos == null )
            return;
        Vector vDatos = new Vector();
        //Inicializo el vector global de errores
        GestorErrores.getInstancia().getvErrores().clear();
        oDatos.selectAll(new Vector(), vDatos);
        //Añado el resto de los elementos
        Vector vectorAux;
        for (int iFila=0; iFila < vDatos.size(); iFila++){
            vectorAux = (Vector) vDatos.get (iFila);
            //Incluyo el código y la descripción
            combo.addItem (vectorAux.get (0) + " - " + vectorAux.get (1));
        }
    }

    /*
     * Recibe como parámetro un combo que se carga a partir del objeto de datos (tabla de hobbies) pasado como parámetro
     * (una tabla con 2 campos Codigo-Descripción) con literales tipo "código - descripcion"
     * Carga la tabla de hobbies y admite filtros por modalidad y caracter de hobby
     * Se incluye además en el combo un elemento vacío para que pueda no seleccionarse nada.
     * Si se pasa null en vez del objeto de datos, el combo se carga con un único elemento vacío.
     */
    public static void cargaComboHobbies ( JComboBox combo, TAHobbies oDatos, String sModalidad, String sCaracter){
        //Inicializo el combo
        combo.removeAllItems();
        //Inicializo el primer elemento como un elemento vacío
        combo.addItem ("");
        if ( oDatos == null )
            return;
        //Establezco las condiciones adicionales
        String sCondicion = "";
        if (sModalidad.compareTo("") != 0)
            sCondicion += "Modalidad = '" + sModalidad + "' AND ";
        if (sCaracter.compareTo("") != 0)
            sCondicion += "Caracter = '" + sCaracter + "' AND ";
        //Quitar el último AND de la condición
        if (sCondicion.compareTo("") != 0)
            sCondicion = sCondicion.substring(0, sCondicion.lastIndexOf("AND") );
        oDatos.setsCondWhere(sCondicion);

        Vector vDatos = new Vector();
        //Inicializo el vector global de errores
        GestorErrores.getInstancia().getvErrores().clear();
        oDatos.selectAll(new Vector(), vDatos);
        //Añado el resto de los elementos
        Vector vectorAux;
        for (int iFila=0; iFila < vDatos.size(); iFila++){
            vectorAux = (Vector) vDatos.get (iFila);
            //Incluyo el código y la descripción
            combo.addItem (vectorAux.get (0) + " - " + vectorAux.get (1));
        }
    }

    public static void seleccionaItemCombo ( JComboBox combo, String sCodigo){
        //inicializo la posición del elemento a seleccionar al primero (el elemento vacío)
        int iPosEltoSel = 0;
        for (int iIndice=0; iIndice < combo.getItemCount(); iIndice++){

            //Actualizo la posición del elemento seleccionado en el combo si se encuentra el código.
            if ( ((String) combo.getItemAt(iIndice)).startsWith(sCodigo + " - ") ){
                iPosEltoSel = iIndice;
                break;
            }
        }
        combo.setSelectedIndex(iPosEltoSel);
    }

    public static String getClaveItemCombo ( JComboBox combo ){
        String sItem = (String) combo.getSelectedItem();
        if (sItem == null)
            return "";
        int iPosicion = sItem.indexOf (" - ");
        if ( iPosicion != -1 )
            sItem = sItem.substring(0, iPosicion);
        // Si el item tenía una cadena vacía se devuelve ""
        return sItem;
    }

    public static int comparaFechas (Date fecha1, Date fecha2){
        if ( (fecha1 == null) & (fecha2 == null) )
            return 0;
        if ( (fecha1 == null) & (fecha2 != null) )
            return -1;
        if ( (fecha1 != null) & (fecha2 == null) )
            return 1;
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        String sfecha1 = formato.format(fecha1);
        String sfecha2 = formato.format(fecha2);
        return sfecha1.compareTo (sfecha2);
    }

    public static void setBackgroundColorActivated (JButton boton, boolean bActivar){
        boton.setBackground(bActivar? Color.pink : UIManager.getColor("Button.background"));
    }

    public static float generaPorcentajeAleatorio(){
        return (float) Math.floor(Math.random()*100);
    }

    public static void cargaComboTabla(JComboBox combo, TAGeneral tAGeneral) {        //Inicializo el combo
        combo.removeAllItems();
        //Inicializo el primer elemento como un elemento vacío
        combo.addItem ("");
        if ( tAGeneral == null )
            return;
        Vector vDatos = new Vector();
        //Inicializo el vector global de errores
        GestorErrores.getInstancia().getvErrores().clear();
        tAGeneral.selectNombreTabla(new Vector(), vDatos);
        //Añado el resto de los elementos
        Vector vectorAux;
        for (int iFila=0; iFila < vDatos.size(); iFila++){
            vectorAux = (Vector) vDatos.get (iFila);
            //Incluyo el código y la descripción
            combo.addItem (vectorAux.get (0) );
        }
    }
    
        public static void cargaComboCampos(String tabla, JComboBox combo, TAGeneral tAGeneral) {        //Inicializo el combo
        combo.removeAllItems();
        //Inicializo el primer elemento como un elemento vacío
        combo.addItem ("");
        if ( tAGeneral == null )
            return;
        Vector vDatos = new Vector();
        //Inicializo el vector global de errores
        GestorErrores.getInstancia().getvErrores().clear();
        tAGeneral.selectNombreCampos(tabla,new Vector(), vDatos);
        //Añado el resto de los elementos
        Vector vectorAux;
        for (int iFila=0; iFila < vDatos.size(); iFila++){
            vectorAux = (Vector) vDatos.get (iFila);
            //Incluyo el código y la descripción
            combo.addItem (vectorAux.get (0) );
        }
    }

    public static void cargaComboValor(String sTabla, String sCampo, JComboBox combo, TAGeneral tAGeneral) {
        combo.removeAllItems();
        //Inicializo el primer elemento como un elemento vacío
        combo.addItem ("");
        if ( tAGeneral == null )
            return;
        Vector vDatos = new Vector();
        //Inicializo el vector global de errores
        GestorErrores.getInstancia().getvErrores().clear();
        tAGeneral.selectNombreValor(sTabla, sCampo,new Vector(), vDatos);
        //Añado el resto de los elementos
        Vector vectorAux;
        for (int iFila=0; iFila < vDatos.size(); iFila++){
            vectorAux = (Vector) vDatos.get (iFila);
            //Incluyo el código y la descripción
            combo.addItem (vectorAux.get (0) );
        }
    }

    /*
     * Recibe como parámetro un combo que se carga a partir del objeto de datos (tabla de CamposPremisas) pasado como parámetro
     * Carga en el combo los nombres de las tablas, o los de los campos si se recibe un nombre de tabla.
     * Se incluye además en el combo un elemento vacío para que pueda no seleccionarse nada.
     * Si se pasa null en vez del objeto de datos, el combo se carga con un único elemento vacío.
     */
    public static void cargaComboCamposPremisas ( JComboBox combo, TACamposPremisas oDatos, String sTabla){
        //Inicializo el combo
        combo.removeAllItems();
        //Inicializo el primer elemento como un elemento vacío
        combo.addItem ("");
        if ( oDatos == null )
            return ;
        Vector vDatos = new Vector();
        //Inicializo el vector global de errores
        GestorErrores.getInstancia().getvErrores().clear();
        //Establezco las condiciones adicionales
        String sCondicion = "";
        //Si viene informado el nombre de la tabla
        if (!sTabla.equals("")){
            sCondicion += "Tabla = '" + sTabla + "'";
            oDatos.setsCondWhere(sCondicion);
            oDatos.selectAll(new Vector(), vDatos);
        }else
            oDatos.selectAllDistinct(new Vector(), vDatos);
        //Añado el resto de los elementos
        Vector vectorAux;
        for (int iFila=0; iFila < vDatos.size(); iFila++){
            vectorAux = (Vector) vDatos.get (iFila);
            if (sTabla.equals(""))
                //Cargo los nombres de las tablas
                combo.addItem (vectorAux.get (0));
            else
                //Cargo los nombres de los campos
                combo.addItem (vectorAux.get (1));
        }
    }

    /**
     * Seleccionar de un combo que solo tiene una descripción en cada item
     * @param combo
     * @param sCodigo
     */
    public static void seleccionaItemComboDescripcion ( JComboBox combo, String sCodigo){
        //inicializo la posición del elemento a seleccionar al primero (el elemento vacío)
        int iPosEltoSel = 0;
        for (int iIndice=0; iIndice < combo.getItemCount(); iIndice++){

            //Actualizo la posición del elemento seleccionado en el combo si se encuentra el código.
            if ( ((String) combo.getItemAt(iIndice)).startsWith(sCodigo) ){
                iPosEltoSel = iIndice;
                break;
            }
        }
        combo.setSelectedIndex(iPosEltoSel);
    }

    public static ObjetoDatos creaTablaAuxiliar (String sNombreTabla){
        //La tabla de valores booleanos es una tabla lógica
        if(sNombreTabla.equalsIgnoreCase("ValoresBooleanos"))
            return new TAValoresBooleanos();
        else if (sNombreTabla.equalsIgnoreCase("actividadesempresas"))
            return new TAActividadesEmpresas();
        else if (sNombreTabla.equalsIgnoreCase("cargosempresa"))
            return new TACargosEmpresa();
        else if (sNombreTabla.equalsIgnoreCase("cilindradasvehiculo"))
            return new TACilindradasVehiculo();
        else if (sNombreTabla.equalsIgnoreCase("estadosciviles"))
            return new TAEstadosCiviles();
        else if (sNombreTabla.equalsIgnoreCase("hobbies"))
            return new TAHobbies();
        else if (sNombreTabla.equalsIgnoreCase("nivelesestudios"))
            return new TANivelesEstudios();
        else if (sNombreTabla.equalsIgnoreCase("paises"))
            return new TAPaises();
        else if (sNombreTabla.equalsIgnoreCase("profesiones"))
            return new TAProfesiones();
        else if (sNombreTabla.equalsIgnoreCase("sexos"))
            return new TASexos();
        else if (sNombreTabla.equalsIgnoreCase("situacioneslaborales"))
            return new TASituacionesLaborales();
        else if (sNombreTabla.equalsIgnoreCase("tiposbien"))
            return new TATiposBien();
        else if (sNombreTabla.equalsIgnoreCase("tiposdocumento"))
            return new TATiposDocumento();
        else if (sNombreTabla.equalsIgnoreCase("tiposelectrodomestico"))
            return new TATiposElectrodomestico();
        else if (sNombreTabla.equalsIgnoreCase("tiposfinanciacion"))
            return new TATiposFinanciacion();
        else if (sNombreTabla.equalsIgnoreCase("tiposinmueble"))
            return new TATiposInmueble();
        else if (sNombreTabla.equalsIgnoreCase("tiposinteres"))
            return new TATiposInteres();
        else if (sNombreTabla.equalsIgnoreCase("tiposocio"))
            return new TATiposOcio();
        else if (sNombreTabla.equalsIgnoreCase("tiposotros"))
            return new TATiposOtros();
        else if (sNombreTabla.equalsIgnoreCase("tipossalud"))
            return new TATiposSalud();
        else if (sNombreTabla.equalsIgnoreCase("tiposvehiculo"))
            return new TATiposVehiculo();
        else if (sNombreTabla.equalsIgnoreCase("usosvehiculo"))
            return new TAUsosVehiculo();
        else if (sNombreTabla.equalsIgnoreCase("zonasinmueble"))
            return new TAZonasInmueble();
        else
            return null;
    }

}